package com.robertux.leaderboard.util;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import com.robertux.leaderboard.beans.entities.Evaluacion;
import com.robertux.leaderboard.beans.entities.Usuario;
import com.robertux.leaderboard.util.gestoresModelos.GestorUsuarios;

public class EvaluacionesFileContentHandler extends FileContentHandler {
	private GestorUsuarios gUsr;

	public EvaluacionesFileContentHandler() {
		super("/Leaderboard/admin/adminEvaluaciones.html", 
				new String[]{"ID Vendedor", "ID Empleado", "Nota", "Ponderacion", "No utilizar esta columna"});
		
		this.gUsr = new GestorUsuarios();
	}

	@Override
	public String[] handleFileContent(String[][] fileContent, String[] discardedRows, String[] mappedColumns) {
		String[] results = new String[fileContent.length];
		
		List<String> lstDiscardedRows = Arrays.asList(discardedRows);
		
		for(int i=0; i<fileContent.length; i++) {
			String result = "";
			if(!lstDiscardedRows.contains(String.valueOf(i))) {
				try {
					Evaluacion eval = this.createEvaluacion(fileContent[i], mappedColumns);
					if(eval != null) {
						eval.getUsuario().addEvaluacion(eval);
						
						if(this.gUsr.actualizarUsuario(eval.getUsuario())) {
							result = "OK - Nueva evaluación agregada";
						} else {
							result = "ERROR - No se pudo insertar nueva evaluación";
						}
					} else {
						result = "ERROR - No se pudo construir una evaluación a partir de los datos ingresados";
					}
				} catch (Exception e) {
					this.logger.error("Error tratando de construir evaluación con las columnas " + Arrays.toString(fileContent[i]) + ": " + e.getMessage(), e);
					result = "ERROR - Error tratando de insertar evaluación: " + e.getMessage();
				}
			}
			results[i] = result;
		}
		
		return results;
	}
	
	private Evaluacion createEvaluacion(String[] contentRow, String[] mappedColumns) {
		Evaluacion eval = new Evaluacion();
		List<String> lstColumns = Arrays.asList(mappedColumns);
		int index = 0;
		
		index = lstColumns.indexOf("ID Vendedor");
		if(index >= 0 && index < contentRow.length) {
			Usuario usr = this.gUsr.getUsuarioByIdVendedor(contentRow[index]); 
			eval.setUsuario(usr);
		}
		
		if(eval.getUsuario() == null) {
			index = lstColumns.indexOf("ID Empleado");
			if(index >= 0 && index < contentRow.length) {
				Usuario usr = this.gUsr.getUsuarioByIdEmpleado(contentRow[index]);
				eval.setUsuario(usr);
			}
		}
		
		if(eval.getUsuario() == null) {
			return null;
		}
		
		index = lstColumns.indexOf("Nota");
		if(index >= 0 && index < contentRow.length) {
			eval.setNota(new BigDecimal(contentRow[index]));
		}
		
		
		index = lstColumns.indexOf("Ponderacion");
		if(index >= 0 && index < contentRow.length) {
			eval.setPonderacion(new BigDecimal(contentRow[index]));
		}
		
		eval.setFecha(new Date());
		this.logger.debug("Evaluación construida: " + eval);
		return eval;
	}

}
